{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "Dataset存储样本和它们相应的标签。\n",
    "\n",
    "DataLoader 在 Dataset 基础上添加了一个迭代器，迭代器可以迭代数据集，以便能够轻松地访问 Dataset 中的样本。\n",
    "\n",
    "PyTorch 领域库提供了一些预加载的数据集(如FashionMNIST)，这些数据集是 torch.utils.data.Dataset 的子类，并实现特定数据的功能。它们可以被用来为你的模型制作原型和基准。\n",
    "\n",
    "## 加载数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "import torch\n",
    "from torch.utils.data import Dataset\n",
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "import matplotlib.pyplot as plt"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz\n",
      "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to ./data/FashionMNIST/raw/train-images-idx3-ubyte.gz\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100.0%\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./data/FashionMNIST/raw/train-images-idx3-ubyte.gz to ./data/FashionMNIST/raw\n",
      "\n",
      "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz\n",
      "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw/train-labels-idx1-ubyte.gz\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100.0%\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw\n",
      "\n",
      "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz\n",
      "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to ./data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100.0%\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to ./data/FashionMNIST/raw\n",
      "\n",
      "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz\n",
      "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100.0%"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to ./data/FashionMNIST/raw\n",
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "training_data = datasets.FashionMNIST(\n",
    "    root = './data/',\n",
    "    train = True,\n",
    "    download = True,\n",
    "    transform = ToTensor()\n",
    ")\n",
    "\n",
    "test_data = datasets.FashionMNIST(\n",
    "    root = './data/',\n",
    "    train = False,\n",
    "    download = True,\n",
    "    transform = ToTensor()\n",
    ")"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 迭代和可视化数据集\n",
    "我们可以像列表一样手动索引 Datasets：training_data[index]。 我们使用 matplotlib 来可视化我们训练数据中的一些样本。"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 800x800 with 9 Axes>",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAn4AAAKSCAYAAABMVtaZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABkWElEQVR4nO3dd5RV5fXA/T0M0yswjTaFoTdBQEBUFEFUFAtoJGAABYliIbbXEjVq1KiJEUkk4s8AokaDolGquECjKCIiShGlF2UaTB+mMef9Iy/zOvLsB+51GvN8P2tlrbjP3fece+c+92zOzN4nwPM8TwAAANDkNWvoAwAAAED9oPADAABwBIUfAACAIyj8AAAAHEHhBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARFH4AAACOoPADAABwBIXfLzBv3jwJCAio/l9oaKi0adNGRo4cKc8995wUFhY29CECpzzWGdDwdu7cKdOmTZMOHTpIaGioREdHy5AhQ2TmzJly5MiROtnna6+9Js8++2ydPLfLmjf0ATQFjzzyiKSlpUlFRYVkZGTIhx9+KDNmzJBnnnlG3n33Xendu3dDHyJwymOdAQ1jyZIlctVVV0lISIj85je/kZ49e0p5ebl88sknctddd8mWLVtkzpw5tb7f1157TTZv3iwzZsyo9ed2GYVfLbjoooukf//+1f997733yqpVq+SSSy6R0aNHy7fffithYWHG3OLiYomIiKivQwVOWawzoP7t3r1brrnmGklJSZFVq1ZJ69atq7dNnz5dduzYIUuWLGnAI4Sv+FVvHRk2bJg88MADsnfvXnnllVdERGTSpEkSGRkpO3fulIsvvliioqJk/PjxIiJSVVUlzz77rPTo0UNCQ0MlMTFRpk2bJrm5uTWed/369TJy5EiJi4uTsLAwSUtLk+uuu67GY15//XXp16+fREVFSXR0tPTq1UtmzpxZPy8cqEesM6BuPfXUU1JUVCQvvfRSjaLvmI4dO8ptt90mIiKVlZXy6KOPSnp6uoSEhEhqaqrcd999UlZWViPnP//5j4waNUratGkjISEhkp6eLo8++qgcPXq0+jHnnnuuLFmyRPbu3Vv9Zx6pqal1+lpdwRW/OnTttdfKfffdJ++//75MnTpVRP63MEaOHClnnXWW/PnPf5bw8HAREZk2bZrMmzdPJk+eLLfeeqvs3r1b/va3v8lXX30la9askaCgIMnKypILLrhA4uPj5Z577pHY2FjZs2ePLFq0qHqfK1eulHHjxsn5558vTz75pIiIfPvtt7JmzZrqxQk0JawzoO6899570qFDBznzzDNP+NgpU6bI/PnzZezYsXLHHXfI559/Lk888YR8++238vbbb1c/bt68eRIZGSm33367REZGyqpVq+TBBx+UgoICefrpp0VE5P7775f8/Hw5cOCA/PWvfxURkcjIyLp5ka7x4Le5c+d6IuJ98cUX6mNiYmK8vn37ep7neRMnTvRExLvnnntqPObjjz/2RMR79dVXa8SXL19eI/7222+fcH+33XabFx0d7VVWVvr7soBGhXUGNIz8/HxPRLzLLrvshI/duHGjJyLelClTasTvvPNOT0S8VatWVcdKSkqOy582bZoXHh7ulZaWVsdGjRrlpaSk+H38MONXvXUsMjLyuK7DG2+8scZ/L1y4UGJiYmTEiBGSk5NT/b9+/fpJZGSkrF69WkREYmNjRURk8eLFUlFRYdxfbGysFBcXy8qVK2v/xQCNFOsMqH0FBQUiIhIVFXXCxy5dulRERG6//fYa8TvuuENEpMbfAf70b3ELCwslJydHzj77bCkpKZFt27b94uOGHYVfHSsqKqqxaJo3by7t2rWr8Zjt27dLfn6+JCQkSHx8fI3/FRUVSVZWloiIDB06VMaMGSMPP/ywxMXFyWWXXSZz586t8fcTN910k3Tu3FkuuugiadeunVx33XWyfPny+nmxQANhnQG1Lzo6WkTkpEYm7d27V5o1ayYdO3asEU9KSpLY2FjZu3dvdWzLli1yxRVXSExMjERHR0t8fLxMmDBBRETy8/Nr8RXAhL/xq0MHDhyQ/Pz8GgshJCREmjWrWW9XVVVJQkKCvPrqq8bniY+PFxGRgIAAefPNN2Xt2rXy3nvvyYoVK+S6666Tv/zlL7J27VqJjIyUhIQE2bhxo6xYsUKWLVsmy5Ytk7lz58pvfvMbmT9/ft29WKCBsM6AuhEdHS1t2rSRzZs3n3ROQECAdXteXp4MHTpUoqOj5ZFHHpH09HQJDQ2VDRs2yP/z//w/UlVV9UsPGyfS0L9rPpWd6G+PHn/8cU9EvP/7v//zPO9/f3sUERFx3ONuuukmLzAw0Ph3Dyfy6quveiLivfjii8btR48e9aZNm+aJiLd9+3afnx9oaKwzoOHccMMNnoh4n376qfVxx9bh1q1ba8QzMjI8EfHuuOMOz/P+/7+h/eijj2o8bs6cOZ6IeKtXr66OXXLJJfyNXx3gV711ZNWqVfLoo49KWlpa9SgJzdVXXy1Hjx6VRx999LhtlZWVkpeXJyIiubm54nleje19+vQREan+NdShQ4dqbG/WrFn1YNuft9QDpzrWGVC37r77bomIiJApU6ZIZmbmcdt37twpM2fOlIsvvlhE5Lg7bTzzzDMiIjJq1CgREQkMDBQRqbHGysvL5fnnnz/uuSMiIvjVbx3gV721YNmyZbJt2zaprKyUzMxMWbVqlaxcuVJSUlLk3XffldDQUGv+0KFDZdq0afLEE0/Ixo0b5YILLpCgoCDZvn27LFy4UGbOnCljx46V+fPny/PPPy9XXHGFpKenS2Fhobz44osSHR1dveimTJkihw8flmHDhkm7du1k7969MmvWLOnTp49069atPt4OoE6wzoD6l56eLq+99pr86le/km7dutW4c8enn34qCxculEmTJsltt90mEydOlDlz5lT/OnfdunUyf/58ufzyy+W8884TEZEzzzxTWrRoIRMnTpRbb71VAgICZMGCBcf9Y0tEpF+/fvLGG2/I7bffLgMGDJDIyEi59NJL6/staHoa9oLjqe3Yr6CO/S84ONhLSkryRowY4c2cOdMrKCio8XjtV1DHzJkzx+vXr58XFhbmRUVFeb169fLuvvtu78cff/Q8z/M2bNjgjRs3zktOTvZCQkK8hIQE75JLLvHWr19f/Rxvvvmmd8EFF3gJCQlecHCwl5yc7E2bNs07ePBg3bwJQB1jnQEN7/vvv/emTp3qpaamesHBwV5UVJQ3ZMgQb9asWdUjWCoqKryHH37YS0tL84KCgrz27dt79957b40RLZ7neWvWrPEGDRrkhYWFeW3atPHuvvtub8WKFcf9qreoqMj79a9/7cXGxnoiwq99a0mA5xnKbAAAADQ5/I0fAACAIyj8AAAAHEHhBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARFH4AAACOOOk7d5zoxstNRYsWLdRtDz74oDH+wgsvqDnbtm37xcd0MsaNG2eMH7vxvMlzzz1XV4dzymiMYyyb2lrTXk9jfO9PRps2bYzxc845R81JTEw0xmfOnOnz/ps10/+93phvcN8Yf96Nea1px2Y75tr8+dvOD1lZWcb4sdsemmi3MhwxYoSas3r1amN89uzZao7m2K3iTLTPZmNeTzYnWmtc8QMAAHAEhR8AAIAjKPwAAAAcQeEHAADgiJNu7nCF7Y9TTzvtNGN80aJFao72R5YLFy5Uc3r37m2Mt2rVSs3p0KGDMb506VI1R2P74+HG+AfaaHi2P5w+evSoMR4WFqbmzJkzxxgvLy9Xc/773/8a4yUlJWrOkCFDjPG0tDQ1JyIiwhg/cOCAmhMbG2uMp6amqjm/+93vjPFT9Q/Omzp/vjf9yant7+Df/va3xvj48ePVnKKiImO8tLRUzdHWYXJyspozaNAgY9x2Xtu7d68xrn0P2ZyqjVQnwhU/AAAAR1D4AQAAOILCDwAAwBEUfgAAAI6g8AMAAHAEhR8AAIAjGOfyM7ZW+czMTGO8srJSzdHa3kePHq3mFBYWGuOdO3dWcwoKCozx/Px8NUfDyBb4yp9xLr///e/VnD59+hjj27dvV3OuuOIKY9w2BklbaxkZGWpOdna2MR4SEqLmaOswPDxczUHToa0Pf0aMXHbZZeo2bTTLgAED1BxtRNIXX3yh5nTr1s0Y1+7hK6KPb9qwYYOao7Ed265du4zx119/Xc159tlnjfFTeWSLDVf8AAAAHEHhBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARAd5JtnDabibdlERFRanbduzYYYwXFxerOVo3348//qjmHDx40BgfOXKkmtO8ublBW+sqFhHp1KmTus0VjbGD+VRca/509c6cOVPN0T6btq5B7SbwFRUVao7284+MjFRzgoODjXFbB6D2M9XWrYjI9OnTjfG8vDw1pzFr6mutWTP9Ooo/3aFbt241xm1TJEpLS43xI0eOqDlaV29SUpKao02R0NagiP65jYuLU3O09aF144voa1frKhbR35/77rtPzfnkk0+Mcduatv3satOJ1hpX/AAAABxB4QcAAOAICj8AAABHUPgBAAA4gsIPAADAERR+AAAAjtD7jh118803q9u0G6rbWtiTk5ON8S5duqg52oiB3NxcNaesrMwYb9OmjZozbtw4Y/xf//qXmgO3aSMr/LnZfMuWLdVt2hgi22gWbVyDbdSMNnohNDRUzdHW7s6dO9UcbfyEbWxMu3btjPFTdZxLU+fPyJbHHntM3Xbo0CFjPCcnR83RPs+2UTPaucM2Okl7vlatWqk52vlTG0EjIhIUFGSM+zOexjZKRVuHd955p5qjjXOx7Uc7t9f3qCOu+AEAADiCwg8AAMARFH4AAACOoPADAABwBIUfAACAI+jq/RlbF4/WSWS7KXNxcbExbusE1jp8tA4nEb1z0dYFqXUw09ULjfZZ1zrpRERGjBhhjGsd7yIi2dnZPudoa0DrEBbRj9t2E/jY2FhjfODAgWrOypUrjXFbN1+PHj2M8c2bN6s5aJy0bs4LLrhAzdG6erXPn4hISEiIMW47D7Ro0cLnHK1z1dapr02l0I5ZRD9/xsTEqDnamrJ9R2k5tvcgJSXFGN+7d6+aU5tTEX4JrvgBAAA4gsIPAADAERR+AAAAjqDwAwAAcASFHwAAgCMo/AAAABzBOJefKSgoULdpN2633QReYxsBo7WQ23K0dnTbuIj09HR1G2Diz43oN23aZIxrN4cX0ddUfn6+mhMWFmaMa+tWRL9xvO0m8NqYDW0shog+gsM2LuK0004zxt944w01B41TmzZtjPHS0lI1R1sftvOANjLFlqONFrOd14KDg41x2/rU1oB2zCL62Bjb+tTY3gNtzIptBMw555xjjC9YsEDNqe+xLRqu+AEAADiCwg8AAMARFH4AAACOoPADAABwBIUfAACAI+jq/Rmti0jEvxss27pqNVo3lbZ/f55LRGT37t0+Px/c5k9XmtaBZ1treXl5xrity077rNs6kW2dfpq0tDRjvHPnzmrOc889Z4y3atVKzbFtw6mlV69ePudoXeq2z3N0dLTP+9HOUbb9aJ3AtvWkrWnbOVJ7vqioKDVHe76ioiI1p7Cw0Bi3rcH+/fsb47au3saCK34AAACOoPADAABwBIUfAACAIyj8AAAAHEHhBwAA4AgKPwAAAEcwzuVnOnbsqG7LysoyxgMCAtQcrbXcNppFez7baBYtx9ZeX1xcrG4DasvgwYONcdtoFm0EjHajdxtt9IRNTEyMuq2srMwY18ZViIjMnTvXGH/ooYfUHG10ju27wzaCAw1nwIABxnhwcLCao23T1oaIyP79+41x2+dZO3fY9hMaGmqM2z6bFRUVxri2nmw5thEw2nnS9j2QnJxsjGtjXkREIiIi1G2NHVf8AAAAHEHhBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARznb12jpkNbZOotrcv9btaOse9kdtPx+aPn/WwK9//WtjvLS0VM0JCQnxef9a155trWkdhXFxcWrOqlWr1G2a1atXG+P33XefmqPdiN7W2Xz48GGfjgv1IygoyBi3TV3QOmS7du2q5mhdvbbOWe0YtK5yEZH8/HxjvLKyUs0JDw/3OUf7jrB1r2vTKjp06KDmdOrUyRj//vvv1ZyWLVsa45GRkWpOUVGRuq0+ccUPAADAERR+AAAAjqDwAwAAcASFHwAAgCMo/AAAABxB4QcAAOAIxrn4QBslYRuLom3zZ5SKP/uxsd24G/CFNqpBRL/ZvHYDdhH9Bui2cS7ayAzb6AdtZIX2XCIi+/btU7f5Ki8vT92mvQeMczn19O3b1xi3jUzRxnpFR0erOT169DDGc3JyLEdnZluf2rgjW472WrXXKaKfp7VRRyIiBQUFxnhycrKao31H2MavaOfPNm3aqDm28TD1iSt+AAAAjqDwAwAAcASFHwAAgCMo/AAAABxB4QcAAOAIZ7t6/aHdNNvGn65ef3K07idb11iLFi3UbYAv+vfvr27TOvBsHai2m9drtI5fratYRCQsLMwYz8rKUnO6dOni24FZ2Nan1jWYkJCg5uzatesXHxNqn/YZtP38tRxbl3ppaakxXllZqeZox1BSUqLmaOciW9e9do7Kzs5WczS2NZ2fn2+Mf/fdd2rO0KFDjXFbB732vqWlpak5dPUCAACgXlH4AQAAOILCDwAAwBEUfgAAAI6g8AMAAHAEhR8AAIAjnB3n0r59e59ztFZ1Wwu7bQSLxtaur9FGzdja+OPj433eD2DStWtXdZv22bSNZNBybGvNn3FL2tgY25gN203YfXXkyBGfcxjDdOrp2LGjMW4bG6SNUykvL1dzIiMjjXFtbJGISEVFhTHeqlUrNUdz6NAhdZs2GsU2MsWf747Q0FBj3DY+Kjc31xj3Z3SObdzTihUr1G31iSt+AAAAjqDwAwAAcASFHwAAgCMo/AAAABxB4QcAAOAIZ7t627Vr53OO1uFj6ybUunr96fb1h607MTw8vF6OAU1f//791W3augkKCvJ5P7Z148+N47Wu3rKyMjUnOjraGLd1J+bl5RnjWgeibVufPn3UnGXLlqnbULdsn2etc9Y2daF169bG+Oeff67mBAYGGuM5OTk+5xQWFqo52mczOTlZzdmxY4cxrr03IvqatnXbatt27dql5vTr188Yt3XQa53Ftu/CxoIrfgAAAI6g8AMAAHAEhR8AAIAjKPwAAAAcQeEHAADgCAo/AAAARzg7zqU2b7Tuz83hbbQWdn/Gxtja3m03ugZ8Ybuhu/YZtI0T0m6AbhvNoq0BbWSLTXl5ubpNG5F04YUXqjmvv/66MV5cXKzm7N271xjX3hs0LG0kiIhIfHy8MX7o0CE1JyQkxBhfvny5mnP11Vcb4y1btlRztPVpGwV2+PBhY9w2AkYbT2OjnaMiIyPVHG29b9u2Tc354YcfjHHb95r2HsTExKg5jQVX/AAAABxB4QcAAOAICj8AAABHUPgBAAA4gsIPAADAEc529SYmJvqco3U5+dM16M/N5m0dutox2LoTgdpi637Lz883xrUbvYuIlJSUGOP+dNDbcmxrSnPgwAFjfODAgWqO1tU7ZcoUn/ePxikuLk7dpnVv284Dmp07d6rbysrKjPH9+/erOWFhYca4reNcY3s9gYGBxnheXp6ao51ztdcpok8L0DqrRfQpH7bJF0lJScZ4bU/5qAuN/wgBAABQKyj8AAAAHEHhBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARzo5zCQoKauhDUPnT4u/PCBiNbcwGN4iHSXR0tLpNu5m5dhN6Ef1zaxuV4HmeMW4bt+TPiKbKykpjvHPnzmoOmr7Y2Fh1m/ZZt33Xa59nbSyKiEiLFi2Mcdu60c6F7dq1U3O0cUtFRUVqTlRUlDHesmVLn4/N9r5pI8y0dSsicvDgQWNcG3Ujoo+hsX0OtJ+d9j1UV7jiBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARFH4AAACOcLarNyIiokH3r3Vs1TZ/uoW0G1aLiOzateuXHA5OcVp3oG09aR14tk7gjIwM3w5M9DVlu9G6drN3W1evlpOYmGg5Ot81lg5AnBxbd2phYaExbuvQzc7ONsZt3eNZWVnGeGZmppqjTXHQumNFRCIjI43x+Ph4NUdb01p3rIjeiWubVqGt90OHDqk52trt1auXmrN9+3Zj3NbVGx4eboxrn4+6whU/AAAAR1D4AQAAOILCDwAAwBEUfgAAAI6g8AMAAHAEhR8AAIAjnB3nYrsBtUYbZWG7YbTG1o6ujZLw58bx/rC15DPOxW2tWrUyxm1jKbTPujZGQkRfa7Z1o61Df9aNbU1rx1ZRUaHm+KO+Rj6hdmhrQ0QkLCzMGC8qKlJz4uLijHHbiBFtRJJt3JI2mqW0tFTNOXz4sDG+f/9+NUc752qvU8S/kUbaurF932ija/bu3avm5ObmGuO2cS6dOnUyxjds2KDm1AWu+AEAADiCwg8AAMARFH4AAACOoPADAABwBIUfAACAI5zt6tVuqG3rGtS6+fxh60rSbjIdFBRUa/u3ad++vbrt888/r5djQOOkdXzbOme1NaV9zkX865zVOgBt+9Gez5ajdQLbOpv94U9nMxqO1rkrInLo0CFjPDw8XM3Rul215xIR2bRpkzGune9E9HOR7fOsdQ9rHcIiIgUFBca41iEsonfb2qZYaN27Bw8eVHM6d+5sjNs6tTUhISHqtpKSEp+fry5wxQ8AAMARFH4AAACOoPADAABwBIUfAACAIyj8AAAAHEHhBwAA4Ahnx7loN622tYnbbtzua45tJIN2DFpru20/thyNbZwL3KaNhbDdAD0/P98Yt904XlsftnXjzzgVbd3YRjIUFhYa49nZ2WpOcnKyMb5v3z6fjw2Nk+3znJCQYIzv3LlTzYmNjTXGtVEqIiI9evQwxm2jZrR1c+TIETVHW9Pa6xQR8TzPGLeNaNKO2zbaTPuO0PYvon9/5eXlqTk5OTnGuG2kjT/n47rAFT8AAABHUPgBAAA4gsIPAADAERR+AAAAjqDwAwAAcISzXb1at5B2w2qR2u2ysz2X1n1UWlqq5mhdTrZuS01SUpLPOXCD1tVbVlam5mhde7Yb1Gvr0NbV6+tziejrw9bdrx1D8+b612m7du2McVtXL04tJSUl6rY9e/YY47ZO4NzcXGN869atao72fLYude1cZOtO1c5RWqeriN6lbOvq1b5X/DlP29b0119/bYxfccUVao7tGDS2Tun6xBU/AAAAR1D4AQAAOILCDwAAwBEUfgAAAI6g8AMAAHAEhR8AAIAjnB3nYhu94CvbaBZtmz+jYWw3mdZu/uzPfmw32obbtHERts+mttZsN1rXnk+7obyNbeyCNrKioKBAzdGOrVkz/d/RiYmJ6jZNbY6PQt2zjcFq3bq1MW4bMaKN/khPT1dz2rZta4xr5wcRfZyKbXzYoUOHjPGsrCw1RxsFZRvrpG2zrWnbiByNNiJn9+7dao52DDExMWqO7bXWJ674AQAAOILCDwAAwBEUfgAAAI6g8AMAAHAEhR8AAIAjnO3q9ecGy/XFn24+LcfWaah1baWmpvq8f7ghODjYGC8sLFRztO5d22dT6zTU9i+irwHbTeDDwsKMcVtXr9ZtaetsTk5OVrehabB1zmpdsFpXuYhIWVmZMV5UVKTmfPPNN8Z4dHS0mqOtz9DQUDUnLi7OGLetgYyMDJ/3o601W8dxTk6OMW77HtA6cW3fUVr3sO1nattWn7jiBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARFH4AAACOoPADAABwhLPjXLS285KSEjWnqqrK5/009I3Wbe3o2giO9u3b19Xh4BQXFRVljGujGkREEhMTjfHc3Fw1p7i42BgPCQlRc/wZ0aSNufjxxx/VHH9uAt+6dWufc2yjMdD4aONXRPSRJc2b66dgbdSQbT9paWnG+N69e9UcbcyJbTyNNlapbdu2ao523Nr4FRF9DdhGwHTv3t0YDwwMVHN27NhhjNvGr2gjZbTnEmn4euAYrvgBAAA4gsIPAADAERR+AAAAjqDwAwAAcASFHwAAgCOc7ert2LGjMW7rGtQ6AG3dd1pXra2bS3s+W0eQ1tGo3eRaRKSystIYt70HcFvnzp2NcVtXr9YlbrtputZx3qJFCzVH68i3dQAWFBQY49raENGP29ZVHBQUpG7T0NV7asnOzla3aZ+zli1bqjkrVqwwxidOnKjmaM93xhlnqDl9+/Y1xnv27KnmtGrVyhi3TZHQzit79uxRc7766itjPCsrS805fPiwMb569Wo1R7NhwwZ1m/YdYTu3+zMZpC5wxQ8AAMARFH4AAACOoPADAABwBIUfAACAIyj8AAAAHEHhBwAA4Ahnx7ns3LnTGG/Xrp2as3TpUmM8Li5OzdFuNr9//341R7t5fUxMjJqj3VB74cKFas6jjz5qjF9zzTVqDtyWnJxsjNvGrCQlJRnj4eHhao42AiY9PV3N0UYXJSQkqDna67GNmtHWtDbuSUQfg2PDOJdTizYiTEQkIiLC5+dLSUnxOUcbZbJ8+XI1x7bNFYGBgcZ4jx491JxvvvnGGLeNXWvbtq1Pz1VXuOIHAADgCAo/AAAAR1D4AQAAOILCDwAAwBEUfgAAAI4I8E6ydczWqdKU2LqvtG4+m7CwMJ/3U1paaowXFRWpOdpN4G0/N62rMi8vT81pahpj5+SpuNY6dOigbvvVr35ljGs3bRcR2bhxozGelpam5pSUlBjj2s3URURiY2ON8bKyMjXn6NGjxviWLVvUnG+//dYYz87OVnOaGpfXmtaNbntPdu3aVWv717pWRUSqqqqM8cbw89J+Ps2a+X7NSlu3NraJANp3R/Pm+rCUrVu3+nwM/jjRz44rfgAAAI6g8AMAAHAEhR8AAIAjKPwAAAAcQeEHAADgCAo/AAAAR5z0OBcAAACc2rjiBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARFH4AAACOoPADAABwBIUfAACAIyj8AAAAHEHhBwAA4AgKPwAAAEdQ+AEAADiCwg8AAMARFH4AAACOoPCrZwEBAXLzzTef8HHz5s2TgIAA2bNnT90fFACjX7IOJ02aJKmpqbV+TADwS1D41aJNmzbJ2LFjJSUlRUJDQ6Vt27YyYsQImTVrVp3v+/HHH5d33nmnzvcD1LWGXEcAdMf+IfTT/yUkJMh5550ny5Yta+jDw0mi8Ksln376qfTv31++/vprmTp1qvztb3+TKVOmSLNmzWTmzJk+P9+1114rR44ckZSUlJN6PIUfmoLaXkcAat8jjzwiCxYskJdfflnuvvtuyc7OlosvvlgWL17c0IeGk9C8oQ+gqXjsscckJiZGvvjiC4mNja2xLSsry+fnCwwMlMDAQOtjPM+T0tJSCQsL8/n5gcaottcRgNp30UUXSf/+/av/+/rrr5fExET517/+JZdcckkDHhlOBlf8asnOnTulR48ex52sREQSEhKOi73zzjvSs2dPCQkJkR49esjy5ctrbDf9bVFqaqpccsklsmLFCunfv7+EhYXJCy+8IAEBAVJcXCzz58+vvvw+adKkWn6FQN072XU0d+5cGTZsmCQkJEhISIh0795dZs+efVzOsTXzySefyBlnnCGhoaHSoUMHefnll4977JYtW2TYsGESFhYm7dq1kz/+8Y9SVVV13OP+85//yKhRo6RNmzYSEhIi6enp8uijj8rRo0d/2YsHTlGxsbESFhYmzZv//9eS/vznP8uZZ54prVq1krCwMOnXr5+8+eabx+UeOXJEbr31VomLi5OoqCgZPXq0/PDDDxIQECB/+MMf6vFVuIMrfrUkJSVFPvvsM9m8ebP07NnT+thPPvlEFi1aJDfddJNERUXJc889J2PGjJF9+/ZJq1atrLnfffedjBs3TqZNmyZTp06VLl26yIIFC2TKlClyxhlnyA033CAiIunp6bX22oD6crLraPbs2dKjRw8ZPXq0NG/eXN577z256aabpKqqSqZPn17jsTt27JCxY8fK9ddfLxMnTpR//vOfMmnSJOnXr5/06NFDREQyMjLkvPPOk8rKSrnnnnskIiJC5syZY7yaPm/ePImMjJTbb79dIiMjZdWqVfLggw9KQUGBPP3007X7hgCNUH5+vuTk5IjneZKVlSWzZs2SoqIimTBhQvVjZs6cKaNHj5bx48dLeXm5vP7663LVVVfJ4sWLZdSoUdWPmzRpkvz73/+Wa6+9VgYNGiQfffRRje2oAx5qxfvvv+8FBgZ6gYGB3uDBg727777bW7FihVdeXl7jcSLiBQcHezt27KiOff31156IeLNmzaqOzZ071xMRb/fu3dWxlJQUT0S85cuXH7f/iIgIb+LEibX+uoD6dLLrqKSk5LjckSNHeh06dKgRO7Zm/vvf/1bHsrKyvJCQEO+OO+6ojs2YMcMTEe/zzz+v8biYmJjj1qFp39OmTfPCw8O90tLS6tjEiRO9lJSUk37tQGN37Lz08/+FhIR48+bNq/HYn6+T8vJyr2fPnt6wYcOqY19++aUnIt6MGTNqPHbSpEmeiHgPPfRQnb0Wl/Gr3loyYsQI+eyzz2T06NHy9ddfy1NPPSUjR46Utm3byrvvvlvjscOHD69xRa53794SHR0tu3btOuF+0tLSZOTIkbV+/EBjcLLr6KdX4o5dfRg6dKjs2rVL8vPzazxn9+7d5eyzz67+7/j4eOnSpUuN9bZ06VIZNGiQnHHGGTUeN378+OOO8af7LiwslJycHDn77LOlpKREtm3b9sveAOAU8Pe//11WrlwpK1eulFdeeUXOO+88mTJliixatKj6MT9dJ7m5uZKfny9nn322bNiwoTp+7E+cbrrpphrPf8stt9TxK3AbhV8tGjBggCxatEhyc3Nl3bp1cu+990phYaGMHTtWtm7dWv245OTk43JbtGghubm5J9xHWlparR4z0NiczDpas2aNDB8+XCIiIiQ2Nlbi4+PlvvvuExE5rvA7mfW2d+9e6dSp03GP69Kly3GxLVu2yBVXXCExMTESHR0t8fHx1b/i+vm+gabojDPOkOHDh8vw4cNl/PjxsmTJEunevbvcfPPNUl5eLiIiixcvlkGDBkloaKi0bNlS4uPjZfbs2TXWyN69e6VZs2bHndc6duxYr6/HNRR+dSA4OFgGDBggjz/+uMyePVsqKipk4cKF1du1bl3P80743HTwwhXaOtq5c6ecf/75kpOTI88884wsWbJEVq5cKb/73e9ERI5ryPgl6+3n8vLyZOjQofL111/LI488Iu+9956sXLlSnnzySeO+ARc0a9ZMzjvvPDl48KBs375dPv74Yxk9erSEhobK888/L0uXLpWVK1fKr3/9a7/WHWoXzR117FjL+8GDB+t0PwEBAXX6/EBD+uk6eu+996SsrEzefffdGlfzVq9e7ffzp6SkyPbt24+Lf/fddzX++8MPP5RDhw7JokWL5JxzzqmO79692+99A01BZWWliIgUFRXJW2+9JaGhobJixQoJCQmpfszcuXNr5KSkpEhVVZXs3r27xhX3HTt21M9BO4orfrVk9erVxn/JLF26VETMvzKqTREREZKXl1en+wDq2smso2NX8H76uPz8/ONOKr64+OKLZe3atbJu3brqWHZ2trz66qs1Hmfad3l5uTz//PN+7xs41VVUVMj7778vwcHB0q1bNwkMDJSAgIAaI4727Nlz3E0Gjv29+s/XD3fpqVtc8aslt9xyi5SUlMgVV1whXbt2lfLycvn000/ljTfekNTUVJk8eXKd7r9fv37ywQcfyDPPPCNt2rSRtLQ0GThwYJ3uE6htJ7OOMjMzJTg4WC699FKZNm2aFBUVyYsvvigJCQl+X1m/++67ZcGCBXLhhRfKbbfdVj3OJSUlRb755pvqx5155pnSokULmThxotx6660SEBAgCxYs4NdXcMqyZcuqG5mysrLktddek+3bt8s999wj0dHRMmrUKHnmmWfkwgsvlF//+teSlZUlf//736Vjx4411lO/fv1kzJgx8uyzz8qhQ4eqx7l8//33IsJvsupMwzUUNy3Lli3zrrvuOq9r165eZGSkFxwc7HXs2NG75ZZbvMzMzOrHiYg3ffr04/JTUlJqjGPRxrmMGjXKuP9t27Z555xzjhcWFuaJCKNdcEo62XX07rvver179/ZCQ0O91NRU78knn/T++c9/nvSaGTp0qDd06NAasW+++cYbOnSoFxoa6rVt29Z79NFHvZdeeum451yzZo03aNAgLywszGvTpk31yBkR8VavXl39OMa5oKkxjXMJDQ31+vTp482ePdurqqqqfuxLL73kderUyQsJCfG6du3qzZ0713vooYe8n5cdxcXF3vTp072WLVt6kZGR3uWXX+599913noh4f/rTn+r7JTohwPP4pyoAAGgcNm7cKH379pVXXnnFOFIJvwx/4wcAABrEkSNHjos9++yz0qxZsxoNVKg9/I0fAABoEE899ZR8+eWXct5550nz5s1l2bJlsmzZMrnhhhukffv2DX14TRK/6gUAAA1i5cqV8vDDD8vWrVulqKhIkpOT5dprr5X7779fmjfn2lRdoPADAABwBH/jBwAA4AgKPwAAAEdQ+AEAADjipP9ysqlN0NZej+11ajdgDw0NVXNuvPFGY/ynt7I52edr1kyv05977jljvKSkRM3Rbl5vO7ampjH+iWtTW2uACGvtVBMUFKRuq6ioMMbbtm2r5syYMcMYj4iIUHO089fDDz+s5hQWFhrj/ryeU9WJ1hpX/AAAABxB4QcAAOAICj8AAABHUPgBAAA4gsIPAADAEU3ifihat6vWhSuid73403l2zTXXqNtuu+02Y1zrqBURiY6ONsZtXb2lpaXG+LPPPqvm1Gb3ru3YbD8HAEDDiYqKMsa17lgRkQkTJhjjF110kZozZ84cY/yzzz5Tcy699FJjfN68eWrO448/box/+eWXao4/NcSpjCt+AAAAjqDwAwAAcASFHwAAgCMo/AAAABxB4QcAAOAICj8AAABHBHgnOb+koW9mbdt/bd78e8iQIeq2q6++2hjv3LmzmqONbUlOTlZzmjc3T9kpKytTc/bs2WOMHzx4UM356KOPjPEFCxaoOf7QfnaN4abtjeEYfq6h1xpQF1hrDcefcVs9e/ZUcx555BFj/Morr/TtwPwUHh6ubtPOX2PGjPF5P7axa7U5Dq22nWitccUPAADAERR+AAAAjqDwAwAAcASFHwAAgCMo/AAAABzR6Lp6a7MD9I477lC3tWvXzhjv2LGjmpOUlGSMr1mzRs1p3769Mf7DDz+oOW3atDHGtZtp255P27+I3j1cUFCg5miv9amnnlJzGjM6DYH6wVprONp3vYhIZWWlMT5nzhw157333vMpLqJ34paUlKg5WletraP2rrvuMsazsrLUnPnz5xvjISEhao5tykZDo6sXAAAAIkLhBwAA4AwKPwAAAEdQ+AEAADiCwg8AAMARFH4AAACO0Hu8G4g/Lf9PP/20MX7WWWepOZ9//rkxXlpaquYsX77cGE9OTlZztm3bZox37dpVzdGe78iRI2pOWFiY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4QcAAOAICj8AAABHUPgBAAA4gsIPAADAERR+AAAAjqDwAwAAcASFHwAAgCMo/AAAABxB4QcAAOAICj8AMNizZ48EBATIn//854Y+FKBRCwgIkJtvvvmEj5s3b54EBATInj176v6goKLwUwQEBJzU/z788MOGPlTglLVp0yYZO3aspKSkSGhoqLRt21ZGjBghs2bNauhDAyANu0Yff/xxeeedd+p8P64J8DzPa+iDaIxeeeWVGv/98ssvy8qVK2XBggU14iNGjJDExMT6PDSgSfj000/lvPPOk+TkZJk4caIkJSXJ/v37Ze3atbJz507ZsWNHgx7fnj17JC0tTZ5++mm58847G/RYgIZwsms0ICBApk+fLn/729+sz3f06FGpqKiQkJAQCQgIOOH+IyMjZezYsTJv3rzaeDn4/zRv6ANorCZMmFDjv9euXSsrV648Lv5zJSUlEh4eXpeHVieKi4slIiKioQ8DDnnsscckJiZGvvjiC4mNja2xLSsrq2EOqp6dqt8XcENtr9HAwEAJDAy0PsbzPCktLZWwsDCfnx8nh1/1/gLnnnuu9OzZU7788ks555xzJDw8XO677z4R+d+iuP766yUxMVFCQ0PltNNOk/nz59fI//DDD42/Lj72t0U//VdORkaGTJ48Wdq1aychISHSunVrueyyy477W4lly5bJ2WefLRERERIVFSWjRo2SLVu21HjMpEmTJDIyUnbu3CkXX3yxREVFyfjx42vtfQFOxs6dO6VHjx7HnVBERBISEqr//7G/H3rnnXekZ8+eEhISIj169JDly5cfl/fDDz/IddddJ4mJidWP++c//1njMeXl5fLggw9Kv379JCYmRiIiIuTss8+W1atXn/CYPc+TG264QYKDg2XRokXV8VdeeUX69esnYWFh0rJlS7nmmmtk//79NXJt3xdAY3Sya/SYE61R09/4paamyiWXXCIrVqyQ/v37S1hYmLzwwgsSEBAgxcXFMn/+/Oo/rZo0aVItv0I3ccXvFzp06JBcdNFFcs0118iECRMkMTFRjhw5Iueee67s2LFDbr75ZklLS5OFCxfKpEmTJC8vT2677Taf9zNmzBjZsmWL3HLLLZKamipZWVmycuVK2bdvn6SmpoqIyIIFC2TixIkycuRIefLJJ6WkpERmz54tZ511lnz11VfVjxMRqayslJEjR8pZZ50lf/7zn7nqgHqXkpIin332mWzevFl69uxpfewnn3wiixYtkptuukmioqLkueeekzFjxsi+ffukVatWIiKSmZkpgwYNqi4U4+PjZdmyZXL99ddLQUGBzJgxQ0RECgoK5P/+7/9k3LhxMnXqVCksLJSXXnpJRo4cKevWrZM+ffoYj+Ho0aNy3XXXyRtvvCFvv/22jBo1SkT+d1XkgQcekKuvvlqmTJki2dnZMmvWLDnnnHPkq6++qnHSNH1fAI1Vba9RzXfffSfjxo2TadOmydSpU6VLly6yYMECmTJlipxxxhlyww03iIhIenp6rb02p3k4KdOnT/d+/nYNHTrUExHvH//4R434s88+64mI98orr1THysvLvcGDB3uRkZFeQUGB53met3r1ak9EvNWrV9fI3717tyci3ty5cz3P87zc3FxPRLynn35aPb7CwkIvNjbWmzp1ao14RkaGFxMTUyM+ceJET0S8e+6556RfP1Db3n//fS8wMNALDAz0Bg8e7N19993eihUrvPLy8hqPExEvODjY27FjR3Xs66+/9kTEmzVrVnXs+uuv91q3bu3l5OTUyL/mmmu8mJgYr6SkxPM8z6usrPTKyspqPCY3N9dLTEz0rrvuuurYsXX49NNPexUVFd6vfvUrLywszFuxYkX1Y/bs2eMFBgZ6jz32WI3n27Rpk9e8efMace37AmisanuNzp071xMRb/fu3dWxlJQUT0S85cuXH7f/iIgIb+LEibX+ulzHr3p/oZCQEJk8eXKN2NKlSyUpKUnGjRtXHQsKCpJbb71VioqK5KOPPvJpH2FhYRIcHCwffvih5ObmGh+zcuVKycvLk3HjxklOTk71/wIDA2XgwIHGX2PdeOONPh0HUJtGjBghn332mYwePVq+/vpreeqpp2TkyJHStm1beffdd2s8dvjw4TX+td+7d2+Jjo6WXbt2icj/fgX71ltvyaWXXiqe59VYAyNHjpT8/HzZsGGDiPzv74yCg4NFRKSqqkoOHz4slZWV0r9//+rH/FR5eblcddVVsnjxYlm6dKlccMEF1dsWLVokVVVVcvXVV9fYZ1JSknTq1Om4dWf6vgAaq9pcozZpaWkycuTIWj9+mPGr3l+obdu21SeRY/bu3SudOnWSZs1q1tXdunWr3u6LkJAQefLJJ+WOO+6QxMREGTRokFxyySXym9/8RpKSkkRE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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "labels_map = {\n",
    "    0: \"T-Shirt\",\n",
    "    1: \"Trouser\",\n",
    "    2: \"Pullover\",\n",
    "    3: \"Dress\",\n",
    "    4: \"Coat\",\n",
    "    5: \"Sandal\",\n",
    "    6: \"Shirt\",\n",
    "    7: \"Sneaker\",\n",
    "    8: \"Bag\",\n",
    "    9: \"Ankle Boot\",\n",
    "}\n",
    "figure = plt.figure(figsize=(8, 8))\n",
    "cols, rows = 3, 3\n",
    "\n",
    "for i in range(1, cols*rows+1):\n",
    "    sample_idx = torch.randint(len(training_data), size=(1,)).item()\n",
    "    img, label = training_data[sample_idx]\n",
    "    figure.add_subplot(rows, cols, i)\n",
    "    plt.title(labels_map[label])\n",
    "    plt.axis('off')\n",
    "    plt.imshow(img.squeeze(), cmap='gray')\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 自定义数据集\n",
    "一个自定义的数据集类必须实现三个函数： __init__, __len__, 和 __getitem__。 以 FashionMNIST 数据集为例，它的图片存储在 img_dir 参数指定的目录中，标签存储在 annotations_file 参数指定的CSV文件中。"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "from torchvision.io import read_image"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [],
   "source": [
    "class CustomImageDataset(Dataset):\n",
    "    def __init__(self, annotation_file, img_dir, transform=None, target_transform=None):\n",
    "        \"\"\"在实例化数据集对象时，__init__ 函数会运行一次，用于初始化图像目录、标签文件和图像转换属性(下一节将详细介绍)\"\"\"\n",
    "        self.img_labels = pd.read_csv(annotation_file)\n",
    "        self.img_dir = img_dir\n",
    "        self.transform = transform\n",
    "        self.target_transform = target_transform\n",
    "\n",
    "    def __len__(self):\n",
    "        \"\"\"函数 __len__ 返回我们数据集中的样本数。\"\"\"\n",
    "        return len(self.img_labels)\n",
    "\n",
    "    def __getitem__(self, idx):\n",
    "        \"\"\"函数 __getitem__ 从数据集中给定的索引 idx 处加载并返回一个样本。根据索引可以确定图像在硬盘上的位置，用 read_image 将其转换为tensor，从 self.img_labels 的csv数据中获取相应的标签，最对它们调用 transform 函数(如果适用)，并返回tensor图像和相应的标签的元组。\"\"\"\n",
    "        img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])\n",
    "        image = read_image(img_path)\n",
    "        label = self.img_labels.iloc[idx, 1]\n",
    "        if self.transform:\n",
    "            image = self.transform(image)\n",
    "        if self.target_transform:\n",
    "            label = self.target_transform(label)\n",
    "        return image, label"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## DataLoaders 准备数据进行训练\n",
    "\n",
    "Dataset 每次加载一组我们数据集的特征和标签样本。在训练一个模型时，我们通常希望以 \"小批量\" 的方式传递样本，在每个训练周期重新打乱数据以减少模型的过拟合，并使用  Python 的 multiprocessing 来加快数据的加载速度。\n",
    "\n",
    "DataLoader 是一个可迭代的对象，它用一个简单的API为我们抽象出这种复杂性。\n"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [],
   "source": [
    "from torch.utils.data import DataLoader\n",
    "\n",
    "train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)\n",
    "test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 遍历 DataLoader\n",
    "我们已经将该数据集加载到 DataLoader 中，并可以根据需要迭代该数据集。每次迭代都会返回一批 train_features 和 train_labels (分别包含 batch_size=64 个特征和标签)。因为我们指定了 shuffle=True，在我们遍历所有批次后，数据会被打乱"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Feature batch shape:torch.Size([64, 1, 28, 28])\n",
      "Labels batch shape:torch.Size([64])\n"
     ]
    }
   ],
   "source": [
    "# 显示图像和标签\n",
    "train_features, train_labels = next(iter(train_dataloader))\n",
    "print(f\"Feature batch shape:{train_features.size()}\")\n",
    "print(f\"Labels batch shape:{train_labels.size()}\")"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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Q09w7733dv154sSJmjRpkkaNGqXt27dr1qxZhpMlR0VFhfbv398vnge9kssdhyVLlnT9eeLEiSooKNCsWbNUV1enUaNGdfeYl9TjfwWXm5ur1NTUi17F0tTUpHA4bDRVz5Cdna0bb7xRBw8etB7FzNfnAOfHxUpKSpSbm9snz4+lS5fqgw8+0Mcffxz38S3hcFjnzp1Tc3Nz3OP76vlwueNwKaWlpZLUo86HHl9A6enpmjJlirZu3dp1WywW09atWzVt2jTDyeydPn1adXV1KigosB7FTHFxscLhcNz5EY1GtWvXrn5/fhw5ckQnT57sU+eH53launSpNm7cqG3btqm4uDju/ilTpigtLS3ufKitrdWhQ4f61PlwteNwKXv37pWknnU+WL8K4tt46623vGAw6K1fv97717/+5S1ZssTLzs72GhsbrUfrVj//+c+97du3e/X19d6nn37qlZWVebm5ud6xY8esR0uqlpYW7/PPP/c+//xzT5L34osvep9//rn33//+1/M8z/vNb37jZWdne5s3b/b27dvn3XXXXV5xcbF39uxZ48kT60rHoaWlxXviiSe8mpoar76+3vvoo4+8W265xRszZozX1tZmPXrCPPLII14oFPK2b9/uNTQ0dG1nzpzpeszDDz/sjRgxwtu2bZu3e/dub9q0ad60adMMp068qx2HgwcPeqtWrfJ2797t1dfXe5s3b/ZKSkq8GTNmGE8er1cUkOd53iuvvOKNGDHCS09P96ZOnert3LnTeqRud88993gFBQVeenq6d/3113v33HOPd/DgQeuxku7jjz/2JF20LVy40PO8Cy/FfvbZZ738/HwvGAx6s2bN8mpra22HToIrHYczZ854s2fP9oYNG+alpaV5I0eO9BYvXtznfki71N9fkrdu3bqux5w9e9Z79NFHvSFDhngDBw707r77bq+hocFu6CS42nE4dOiQN2PGDC8nJ8cLBoPe6NGjvSeffNKLRCK2g38DH8cAADDR458DAgD0TRQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAEz8H0CDr2k1NG78AAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Label:4\n"
     ]
    }
   ],
   "source": [
    "img = train_features[0].squeeze()\n",
    "label = train_labels[0]\n",
    "plt.imshow(img, cmap='gray')\n",
    "plt.show()\n",
    "print(f\"Label:{label}\")"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}